{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 最大二分匹配\n",
    "\n",
    "import igraph as ig\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 节点0-4在一侧, 5-8在另一侧\n",
    "g = ig.Graph.Bipartite(\n",
    "    [0, 0, 0, 0, 0, 1, 1, 1, 1],\n",
    "    [(0, 5), (1, 6), (1, 7), (2, 5), (2, 8), (3, 6), (4, 5), (4, 6)]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 检测是否二分图\n",
    "assert g.is_bipartite()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 匹配最大二分图\n",
    "matching = g.maximum_bipartite_matching()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Matching is:\n",
      "0 - 5\n",
      "1 - 7\n",
      "2 - 8\n",
      "3 - 6\n",
      "4 - None\n",
      "Size of maximum matching is: 4\n"
     ]
    }
   ],
   "source": [
    "# 输出匹配的顶点\n",
    "matching_size = 0\n",
    "print(\"Matching is:\")\n",
    "for i in range(5):\n",
    "    print(f\"{i} - {matching.match_of(i)}\")\n",
    "    if matching.is_matched(i):\n",
    "        matching_size += 1\n",
    "print(\"Size of maximum matching is:\", matching_size)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot: >"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 700x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制二分图, 红色高亮显示最大匹配的边\n",
    "fig, ax = plt.subplots(figsize=(7, 3))\n",
    "ig.plot(\n",
    "    g,\n",
    "    target=ax,\n",
    "    layout=g.layout_bipartite(),\n",
    "    vertex_size=0.4,\n",
    "    vertex_label=range(g.vcount()),\n",
    "    vertex_color=\"lightblue\",\n",
    "    edge_width=[3 if e.target == matching.match_of(e.source) else 1.0 for e in g.es],\n",
    "    edge_color=[\"red\" if e.target == matching.match_of(e.source) else \"black\" for e in g.es]\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10.6 ('py310')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "49ec5068d4d6d3736c39d3918a16f1ca551a23384109b69898c01c2015d1370c"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
